import cplistHtml from 'ngtemplate!html!../../../tpls/dialog/cplist.dialog.html';
import validHtml from 'ngtemplate!html!../../../tpls/dialog/valid.dialog.html';

class CourseEditController {
    constructor($rootScope, $scope, $cookieStore, $timeout, $state, ngDialog, dialogService, arrayService, CourseService, getCourseDetail, getCpList, getCpListTiming, getRaceDetail, iRunner, RunnerService, ScoreService){

        var vm = this;

        vm.$rootScope      = $rootScope;
        vm.$cookieStore    = $cookieStore;
        vm.$timeout        = $timeout;
        vm.$state          = $state;
        vm.ngDialog        = ngDialog;
        vm.dialogService   = dialogService;
        vm.arrayService    = arrayService;
        vm.CourseService   = CourseService;
        vm.ScoreService    = ScoreService
        vm.RunnerService   = RunnerService;
        vm.getCourseDetail = getCourseDetail;
        vm.getCpList       = getCpList;
        vm.iRunner         = iRunner;
        vm.getCpListTiming = getCpListTiming;
        vm.getRaceDetail = getRaceDetail;
        
        vm.recalc = true;

        // 计时点类型列表
        vm.cp_type_list  = iRunner.cpTypeConfig; 

        // 拖拽配置
        vm.sortableConfig = { group: 'cp', animation: 150 };
        
        // 赛道类型
        vm.track_types = iRunner.courseConfig.trackTypes;

        // 比赛类型
        vm.race_types = iRunner.courseConfig.raceTypes;

        // 缓存计时点数据
        vm.listGroups = [];

        // 缓存导入计时点
        vm.othersCp = [];

        // 计时点列表
        vm.getCpListTiming.code==0&&(vm.message = vm.getCpListTiming.data);
        // vm.getCpList.code==0&&(vm.message = vm.getCpList.data);
        // console.log(vm.message);

        // 表单数据初始化
        vm.course = {
            course_name: '',
            course_num: '',
            course_start_time: '',
            recalc: '',
            course_end_time: '',
            course_close_time: '',
            course_track_type: 'oneway',
            course_race_type: '0',
            course_distance: '',
            course_timing: '',
            format_type: '8',
            timing: '0',
            lap_time: '',
            ranking_man: false,
            ranking_woman: false,
            team_ranking_man: false,
            team_ranking_woman: false,
            ranking_team: false
        }

        // 获取科目详情
        if (vm.getCourseDetail.code==0) {

            var Detail = vm.getCourseDetail.data;

            vm.course.course_name       = Detail.course_name;
            vm.course.course_num        = Detail.reg_num;
            vm.course.course_start_time = moment(Detail.gun_time)._d;
            vm.course.course_end_time   = moment(Detail.latest_gun_time)._d;
            vm.course.course_track_type = Detail.course_type;
            vm.course.format_type       = Detail.dist_team == 'yes' ? 8 : 1;
            vm.course.timing            = Detail.auto_fill_start == 'yes' ? 0 : 1;
            //关门时间
            if (!Detail.close_time) {
                vm.course.course_close_time = '';
            } else {
                vm.course.course_close_time = moment(Detail.close_time)._d;
            }

            // 遍历数据算出比赛成绩排序类别
            angular.forEach(iRunner.courseConfig.ranking, function(value, index) {
                if ((Detail.score_show & value.value) == value.value) {
                    vm.course[value.scope] = true;
                }
            });

            // 根据计时点排序返回的字符串截取成数组, 遍历计时点数组排列出相应的顺序
            angular.forEach(Detail.calc_seq.split(','), function(value, index) {
                angular.forEach(vm.message, function(n, i) {
                    if (value == n.cp_index) {
                        vm.listGroups.push(n);
                    }
                })
            });

            // 填写间隔时间
            vm.$timeout( () => {
                if (Detail.cp_laptime) {
                    angular.forEach(Detail.cp_laptime.split(','), function(value, index) {
                        $($('.laptime')[index]).val(value);
                    });
                }
            }, 0)
            

            // vm.$timeout( () => {
            //     if (Detail.cp_type) {
            //         angular.forEach(Detail.cp_type.split(','), function(value, index) {
            //             var cpType  = document.getElementsByName('cpType');
            //             cpType[index].value = value;
            //         });
            //     }
            // }, 0)

            // 判断是否为绕圈定时
            if (Detail.course_type=='circle'&&Detail.race_type=='timing') {
                vm.course.course_race_type = 0;
                vm.course.course_timing    = Detail.time;
            }

            // 判断是否为绕圈定距
            if (Detail.course_type=='circle'&&Detail.race_type=='distance') {
                vm.course.course_race_type = 1;
                vm.course.course_distance  = Detail.circle;
            }

            // 判断是否为绕圈或折返显示单圈时间
            if (Detail.course_type=='circle' || Detail.course_type=='retrace') {
                vm.course.lap_time = Detail.lap_time;
            }

        }
        
        // 监听发枪时间变化
        $scope.$watch(angular.bind(vm, () => vm.course.course_start_time ), (newValue, oldValue) => {
            if (newValue) {
                angular.element(document.getElementsByName('startTime')).removeAttr("style")
            }
        });

        // 监听最晚出发时间变化
        $scope.$watch(angular.bind(vm, () => vm.course.course_end_time ), (newValue, oldValue) => {
            if (newValue) {
                angular.element(document.getElementsByName('endTime')).removeAttr("style")
            }
        });

        // 监听关门时间变化
        $scope.$watch(angular.bind(vm, () => vm.course.course_close_time ), (newValue, oldValue) => {
            if (newValue) {
                angular.element(document.getElementsByName('closeTime')).removeAttr("style")
            }
        });

        // 监听赛道类型变化，置空计时点表格
        vm.changeFn = (newValue) => {
            if (newValue) {
                vm.listGroups = [];
            }
        }
        
        // 点击显示导入计时点数据
        vm.importCp = function() {

            // 置空
            vm.othersCp = [];

            // 取出其他的CP点
            if (vm.course.course_track_type != 'retrace' && vm.course.course_track_type != 'custom') {
                angular.forEach(vm.message, function(value, index){
                    if (vm.listGroups.indexOf(value)==-1) {
                        vm.othersCp.push(value)
                    }
                });
            } else if (vm.course.course_track_type == 'retrace' || vm.course.course_track_type == 'custom') {
                vm.othersCp = vm.message
            }

            // 显示模态框
            vm.ngDialog.open({
                template: cplistHtml,
                className: 'ngdialog-theme-default ngdialog-alert',
                scope: $scope
            });
        }

        // 导入计时点
        vm.importCpBtn = function() {
            var cpData = document.getElementsByName("cpData");  
            for(var i = 0; i < cpData.length; i++) {    
                if(cpData[i].checked) {
                    angular.forEach(vm.othersCp, function(value, index){
                        if (i==index) {
                            vm.listGroups.push(value)
                        }
                    });
                }
            }
        }
        
        // 表单提交
        vm.submitForm = function(isValid) {
            
            // 验证失败, 提示用户
            if (!isValid) {
                
                if (!vm.course.course_name) {
                    $.blink(angular.element(document.getElementsByName('courseName')), 5, 100)
                } else if (!vm.course.course_num) {
                    $.blink(angular.element(document.getElementsByName('courseNum')), 5, 100)
                } else if (!vm.course.course_start_time) {
                    $.blink(angular.element(document.getElementsByName('startTime')), 5, 100)
                } else if (vm.course.course_track_type=='oneway'&&!vm.course.course_end_time) {
                    $.blink(angular.element(document.getElementsByName('endTime')), 5, 100)
                } else if (!vm.course.course_close_time) {
                    $.blink(angular.element(document.getElementsByName('closeTime')), 5, 100)
                } else if (vm.course.course_track_type=='circle'&&vm.course.course_race_type==0&&!vm.course.course_timing) {
                    $.blink(angular.element(document.getElementsByName('courseTiming')), 5, 100)
                } else if ((vm.course.course_track_type=='circle' || vm.course.course_track_type=='retrace')&&!vm.course.course_distance) {
                    $.blink(angular.element(document.getElementsByName('courseDistance')), 5, 100)
                } else if ((vm.course.course_track_type=='circle' || vm.course.course_track_type=='retrace')&&!vm.course.lap_time) {
                    $.blink(angular.element(document.getElementsByName('courseLapTime')), 5, 100)
                }
                
            }

            // 验证通过
            if (isValid) {
                
                if (vm.course.course_num<=0) {
                    $.blink(angular.element(document.getElementsByName('courseNum')), 5, 100)
                    return false
                } else if (vm.course.course_track_type=='oneway'&&!vm.course.course_end_time) {
                    $.blink(angular.element(document.getElementsByName('endTime')), 5, 100)
                    return false
                }
                
                // 计算比赛排名类型
                // var ranking_man        = vm.course.ranking_man ? 2 : 0,
                //     ranking_woman      = vm.course.ranking_woman ? 4 : 0,
                //     team_ranking_man   = vm.course.team_ranking_man ? 16 : 0,
                //     team_ranking_woman = vm.course.team_ranking_woman ? 32 : 0,
                //     ranking_team       = vm.course.ranking_team ? 64 : 0;
                    
                // var person_score_show  = ranking_man + ranking_woman;
                // var team_score_show    = team_ranking_man + team_ranking_woman + ranking_team;
                // var score_show         = vm.course.format_type == '8' ? (parseInt(vm.course.format_type) + team_score_show) : (parseInt(vm.course.format_type) + person_score_show);
                var latest_gun_time    = vm.course.course_track_type == 'oneway' ? (moment(vm.course.course_end_time).format('YYYY-MM-DD') + ' ' + moment(vm.course.course_end_time).format('HH:mm:ss')) : '';
                var close_time         = moment(vm.course.course_close_time).format('YYYY-MM-DD') + ' ' + moment(vm.course.course_close_time).format('HH:mm:ss');

                // 最晚出发时间不能小于发枪时间
                if (latest_gun_time&&(moment(latest_gun_time)<moment(vm.course.course_start_time))) {
                    dialogService.error('最晚出发时间不能小于发枪时间')
                    return false
                }

                // 关门时间不能小于出发时间
                if (moment(close_time)<moment(latest_gun_time)) {
                    dialogService.error('关门时间不能小于出发时间')
                    return false
                }

                // 计算CP点排序
                var array   = [],
                    cptyArr = [],
                    laptimeArray = [],
                    cptyArr  = [];

                angular.forEach(vm.listGroups, function(value, index) {
                    array.push(value.cp_index);
                    //计时点间隔时间
                    laptimeArray.push($($('.laptime')[index]).val());
                    //计时点类型设置
                    //第一个计时点并且枪声计时点的场合
                    if (index == 0 && vm.course.timing == 1) {
                        cptyArr.push('start');
                    } else {
                        cptyArr.push('middle');
                    }

                });

                // 绕圈赛的场合并且只有一个cp点的情况（cp点类型为start）
                if (cptyArr.length == 1 &&  vm.course.timing == 0) {
                    cptyArr[0] = "start";
                }

                //判断自定义赛事间隔时间
                if (vm.course.course_track_type == 'custom') {
                    vm.checkLaptimeFlag = true;
                    for(var i = 1; i < laptimeArray.length; i++) {
                        if (parseInt(laptimeArray[i]) < parseInt(laptimeArray[i - 1]) || !parseInt(laptimeArray[i])) {
                            vm.checkLaptimeFlag = false;
                        }
                    }
                    if (!vm.checkLaptimeFlag) {
                        vm.dialogService.error('请填写计时点间隔时间，并且后面计时点间隔时间不能小于前面时间。');
                        return false;
                    }
                }

                // 拼接POST数据格式
                var params = {
                    course_name: vm.course.course_name,
                    reg_num: vm.course.course_num,
                    course_type: vm.course.course_track_type,
                    calc_seq: array.join(','),
                    cp_type: cptyArr.join(','),
                    cp_laptime: laptimeArray.join(','),
                    gun_time: moment(vm.course.course_start_time).format('YYYY-MM-DD HH:mm:ss'),
                    latest_gun_time: latest_gun_time,
                    close_time: close_time,
                    dist_team: vm.course.format_type == 8 ? 'yes' : 'no',
                    auto_fill_start: vm.course.timing == 0 ? 'yes' : 'no'
                    // ,
                    // score_show: vm.course.format_type == '8' ? 120 : 7
                    // score_show: score_show
                }

                // check 发枪时间在比赛开始时间里
                if (params.gun_time < vm.getRaceDetail.data.start_time) {
                    dialogService.error('科目发枪时间不能小于赛事开始时间，请重新编辑');
                    return false;
                } else if (params.gun_time > vm.getRaceDetail.data.end_time) {
                    dialogService.error('科目发枪时间不能大于赛事结束时间，请重新编辑');
                    return false;
                } else if (!params.close_time && params.close_time < vm.getRaceDetail.data.start_time) {
                    dialogService.error('科目关门时间不能小于赛事开始时间，请重新编辑');
                    return false;
                } else if (!params.close_time && params.close_time > vm.getRaceDetail.data.end_time) {
                    dialogService.error('科目关门时间不能大于赛事结束时间，请重新编辑');
                    return false;
                }

                // 判断是否为绕圈定时
                if (vm.course.course_track_type == 'circle' &&  vm.course.course_race_type == 0) {
                    params.race_type = 'timing';
                    params.time      = vm.course.course_timing;
                }

                // 判断是否为绕圈定距
                if (vm.course.course_track_type == 'circle' &&  vm.course.course_race_type == 1) {
                    params.race_type = 'distance';
                    params.circle    = vm.course.course_distance;
                }

                // 判断是否为绕圈定距
                if (vm.course.course_track_type == 'retrace') {
                    params.circle = vm.course.course_distance;
                }
                
                // 判断是否为绕圈或折返显示单圈时间
                if (vm.course.course_track_type=='circle' || vm.course.course_track_type=='retrace') {
                    params.lap_time = vm.course.lap_time;
                }

                // 判断是否重新计算成绩
                if (vm.course.recalc) {
                    vm.recalc = true;
                } else {
                    vm.recalc = false;
                }

                vm.CourseService.postCourseUpdate(params, vm.$cookieStore.get('access_token'), vm.$state.params.course_id)
                .then(function(data) {


                    if (data.code==0 && vm.recalc) {
                        //重新计算成绩
                        
                        // 显示进度条
                        $rootScope.progressBar = true;

                        var status = '', start = '', total = '';
                        // 完结时间
                        var dueTime = '--';

                        // 重新计算所有成绩（调用后台接口）
                        var importStart = (status, start, total) => {
                            vm.ScoreService.getRealtimeScorecalc(vm.$cookieStore.get('access_token'), vm.$state.params.race_id + '&start=' + start)
                            .then( data => {
                                if (data.code == 0) {

                                    status = data.data.status;
                                    start = data.data.current;
                                    total = data.data.total;

                                    //设置进度条百分比
                                    $rootScope.progress =  parseInt(start/total*100) + '%';
                                    //总条数
                                    $rootScope.total = total;
                                    //完结条数
                                    $rootScope.begin = start;
                                    // 完结时间（耗时）
                                    $rootScope.dueTime = parseInt((total-start)/4) + '秒';


                                    if (status == 'continue') {
                                        importStart(status, start, total);
                                    } else if (status == 'done') {
                                        $rootScope.progressBar = false;
                                        vm.dialogService.success('重新计算成绩成功', 'dashboard.race.index');
                                    }

                                } else {
                                    vm.dialogService.error(data.message);
                                }

                            }, error => {
                                vm.dialogService.error("计算失败");
                            });
                        }

                        importStart(status, start, total);



                        

                    } else if (data.code==0) {
                        // 成功调用
                        data.code==0&&vm.dialogService.success('更新成功',  vm.$state.params.type == 'gun_time' ? 'dashboard.race.guntime' : 'dashboard.race.index');
                    }

                    

                    // 调用失败, 提示用户
                    (data.code!=0&&data.code!=-1001)&&vm.dialogService.error(data.message);

                    // 登录信息已过期, 请重新登录
                    data.code==-1001&&vm.dialogService.error(data.message, true);
                    
                }, function(data) {
                    console.log('error')
                });

            }
            
            return false;
        }

        // 删除科目
        vm.deleteItems = function(course_id) {

            // 模态框显示文本
            $rootScope.common = {
                text : '是否删科目信息'
            }

            vm.ngDialog.open({
                template: validHtml,
                className: 'ngdialog-theme-default ngdialog-alert',
                scope: $scope
            });

            // 提交表单
            $rootScope.submitDelForm = function(isValid) {

                // 验证失败, 提示用户
                if (!isValid) {
                    vm.dialogService.error();
                }

                // 验证通过
                if (isValid) {

                    // 关闭模态框
                    ngDialog.close();

                    vm.CourseService.postCourseDel({course_id: course_id}, vm.$cookieStore.get('access_token'), vm.$state.params.race_id)
                    .then(function(data) {
                        
                        // 成功调用
                        data.code==0&&vm.dialogService.success('科目信息删除成功', 'dashboard.race.index');

                        // 调用失败, 提示用户
                        (data.code!=0&&data.code!=-1001)&&vm.dialogService.error(data.message);

                        // 登录信息已过期, 请重新登录
                        data.code==-1001&&vm.dialogService.error(data.message, true);

                    }, function(data) {
                        console.log('error')
                    });
                }

                return false;
            }
        }

    }
}

CourseEditController.$inject = ['$rootScope', '$scope', '$cookieStore', '$timeout', '$state', 'ngDialog', 'dialogService', 'arrayService', 'CourseService', 'getCourseDetail', 'getCpList', 'getCpListTiming', 'getRaceDetail', 'iRunner', 'RunnerService', 'ScoreService']; 

export default CourseEditController;
